package juc.异步回调.future.FutureTask;

import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class FutureAPIDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
        Instant start = Instant.now();
        //创建futureTask放入线程池
        FutureTask<String> futureTask = new FutureTask<>(() -> {
            System.out.println(Thread.currentThread().getName() + "\t -----come in");
            try {
                TimeUnit.SECONDS.sleep(4);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "task over";
        });
        Duration dur = Duration.between(start, Instant.now());
        System.out.println("【耗时】（ms）" + dur.toMillis());
        Thread t1 = new Thread(futureTask, "t1");
        t1.start();

        System.out.println(Thread.currentThread().getName() + " ----忙其它任务去了");

        /*
         * 两种阻塞方式
         */
        //方式一：get() 容易导致阻塞，一般建议放在程序后面，建议禁用get。
        System.out.println(futureTask.get(3,TimeUnit.SECONDS)); //设置阻塞的最大等待时间

        //方式二：isDone() 轮询，耗费CPU资源。但是可以省一些资源
//        while (true) {
//            if (futureTask.isDone()) {
//                //如果futureTask处理完成，则取出处理结果
//                System.out.println(futureTask.get());
//                break;
//            } else {
//                //暂停毫秒
//                try {
//                    TimeUnit.MILLISECONDS.sleep(500);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                System.out.println("正在处理中，不要再催了");
//            }
//        }

    }
}